﻿//using System;
//using System.Collections.Generic;
//using System.Linq;
//using System.Text;
//using System.Reflection;
//using NLite.Reflection;

//namespace NLite
//{
//    public static class ObjectExtensions
//    {
//        //public static T Clone<T>(this T obj)
//        //{
//        //    if (obj == null)
//        //        return default(T);

//        //    var cloneable = obj as ICloneable;
//        //    if (cloneable != null)
//        //        return (T)cloneable.Clone();

//        //    var ser = ServiceLocator.Current.Get<ISerializer>();
//        //    if (ser != null)
//        //    {
//        //        var str = ser.Serialize(obj);
//        //        return ser.Deserialize<T>(str);
//        //    }

//        //    return default(T);
//        //}

//        //public static void FromTo(this object target, object source)
//        //{
//        //    if (source == null || target == null)
//        //        return;

//        //    const BindingFlags flags = BindingFlags.Instance | BindingFlags.Public;

//        //    var q = (from sp in source.GetType().GetProperties(flags)
//        //             from tp in target.GetType().GetProperties(flags)
//        //             let sourcePropertyParameterLength = sp.GetIndexParameters().Length
//        //             let targetPropertyParameterLength = tp.GetIndexParameters().Length
//        //             let getMethod = sp.GetGetMethod()
//        //             let setMethod = tp.GetSetMethod()
//        //             where string.Equals(sp.Name, tp.Name, StringComparison.InvariantCultureIgnoreCase)
//        //             where sourcePropertyParameterLength == 0 && targetPropertyParameterLength == 0
//        //             where sp.PropertyType == tp.PropertyType
//        //             where getMethod != null && setMethod != null
//        //             select new { SourceProperty = getMethod, TargetProperty = setMethod }).ToArray();

//        //    foreach (var item in q)
//        //        item.TargetProperty.FastInvoke(target, item.SourceProperty.FastInvoke(source));


//        //    var q2 = (from sf in source.GetType().GetFields(flags)
//        //              from tf in target.GetType().GetFields(flags)
//        //              where string.Equals(sf.Name, tf.Name, StringComparison.InvariantCultureIgnoreCase)
//        //              where sf.FieldType == tf.FieldType
//        //              select new { SourceField = sf, TargetField = tf }).ToArray();

//        //    foreach (var item in q2)
//        //        item.TargetField.Set(target, item.SourceField.Get(source));
//        //}
//    }
//}
